package com.kaikeba.service;

import com.kaikeba.bean.Express;
import com.kaikeba.dao.BaseExpressDao;
import com.kaikeba.dao.imp.ExpressDaoMysql;
import com.kaikeba.exception.DuplicateCodeException;
import com.kaikeba.util.RandomUtil;
import com.kaikeba.util.SMSUtil;

import java.util.List;
import java.util.Map;

public class ExpressService {
    private static BaseExpressDao dao = new ExpressDaoMysql();

    /**
     * 用于获取控制台所需的快递数据
     *
     * @return [{size:快递总数,day:快递总数今日新增}, {size:代取件总数,day:代取件总数今日新增}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 获取快件列表（分页）
     *
     * @param limit      是否分页，0表示关闭分页
     * @param offsetm    sql语句开始的索引
     * @param pageNumber 获取快递的数量
     * @return 快件列表
     */
    public static List<Express> findAll(int limit, int offsetm, int pageNumber) {
        return dao.findAll(limit, offsetm, pageNumber);
    }

    /**
     * 根据单号查询快件
     *
     * @param number 单号
     * @return 快件
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据取件码查询快递信息
     *
     * @param code 取件码
     * @return 快件
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据用户的手机号，查询快递信息
     *
     * @param phoneNumber 手机号
     * @return 快件列表
     */
    public static List<Express> findByUserPhone(String phoneNumber) {
        return dao.findByUserPhone(phoneNumber);
    }

    /**
     * 根据录入人手机号查询快递
     *
     * @param sysPhone 录入人手机号
     * @return 快件列表
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快件录入
     *
     * @param express 快件
     * @return 是否录入成功
     */
    public static boolean insert(Express express){
        express.setCode(RandomUtil.getCode()+"");
        try {
            boolean result = dao.insert(express);
            if(result){
                SMSUtil.send(express.getUserPhone(), express.getCode());
            }
            return result;
        } catch (DuplicateCodeException e) {
            return insert(express);
        }
    }

    /**
     * 根据快递id，修改快递信息
     *
     * @param id      要修改的快递id
     * @param express 新的快递信息
     * @return 是否修改成功
     */
    public static boolean update(int id, Express express) {
        boolean result;
        Express oldE = dao.findById(id);
        if(express.getUserPhone() != null){
            result = dao.delete(id) && insert(express);
        }else{
            result = dao.update(id, express);
            if(express.getStatus() == 1){
                updateStatus(express.getCode());
            }
        }
        return result;
    }

    /**
     * 删除快件
     *
     * @param id 要删除的快件id
     * @return 是否删除成功
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }

    /**
     * 确认取件
     *
     * @param code 确认取件的快递单号
     * @return 是否更改成功
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }
}
